﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _1对多
{
    //请假单

    //有可能在更新数据库的时候（update-database）提示如下错误信息：
    //将 FOREIGN KEY 约束 'FK_T_Leaves_T_Users_RequesterId' 引入表 'T_Leaves' 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION，或修改其他 FOREIGN KEY 约束。
    //无法创建约束。请参阅前面的错误消息。

    //原因是Leave中有两个User类型的属性，而且这两个属性都设置了外键。默认情况下，迁移文件中，
    //可以看到RequesterId和ApproverId中分别有一句：onDelete: ReferentialAction.Cascade（级联删除）
    //这可能会导致多次删除同一条数据。比如，删除User中的一条数据，而Leave中Requester和Approver都是该User，
    //那么可能会导致：删除User时，执行级联删除，那么该Leave已经被删除了。但因为有两个外键（都是级联删除），
    //就会第二次执行级联删除，但是这时候数据已经没有了。

    //解决办法：

    //1、推荐：移除迁移文件（Remove-Migration），然后在LeaveConfig中修改外键配置语句，加上：.OnDelete(DeleteBehavior.NoAction)
    //      builder.HasOne<User>(x => x.Requester).WithMany().IsRequired().OnDelete(DeleteBehavior.NoAction);
    //再生成迁移，再更新数据库。

    //2、移除迁移文件，修改实体Leave类，把所有User类型的属性均设置为可为空：User?。
    //这样在生成的迁移文件中，只有一个外键属性中有onDelete: ReferentialAction.Cascade(级联删除)

    //3、修改迁移文件，把其中一条（或者全部）onDelete: ReferentialAction.Cascade修改为：onDelete: ReferentialAction.NoAction

    public class Leave
    {
        public int Id { get; set; }
        
        public User? Requester { get; set; } //单向导航属性，即在User实体中，没有Leaves属性
        public User? Approver { get; set; }  //单向导航属性
        public string Remark { get; set; }
    }
}
